分享自訂 Hooks 的重要性在於提供 React 開發者一個有效的方式,以促進代碼可讀性、可重用性和可維護性。自訂 Hooks 允許我們將複雜的邏輯和狀態管理抽象化,並與社群共享這些寶貴的資源。這不僅有助於加速應用程式開發,還能使新手更容易理解和運用 React 的強大功能。現在,讓我們深入研究七個常見的 Hooks,即 useCallback、useRef、useMemo、useReducer、useContext、useState、以及 useEffect,並提供每個 Hooks 的三個實際案例和解釋,讓您能更清楚地掌握這些強大的工具。讓我們開始吧!
useCallback 範例:
useRef 範例:
useMemo 範例:
useReducer 範例:
useContext 範例:
useState 範例:
useEffect 範例:
範例 1:使用 useContext
實現全域主題設定
import React, { createContext, useContext } from 'react';
// 創建一個上下文(Context)來存儲主題設定
const ThemeContext = createContext();
const ThemeProvider = ({ children }) => {
const theme = 'light'; // 這裡假設主題是"light"
return (
<ThemeContext.Provider value={theme}>
{children}
</ThemeContext.Provider>
);
}
const ThemedComponent = () => {
// 使用 useContext Hook 獲取主題設定
const theme = useContext(ThemeContext);
return (
<div className={`theme-${theme}`}>
<p>目前主題:{theme}</p>
</div>
);
}
function App() {
return (
<ThemeProvider>
<ThemedComponent />
</ThemeProvider>
);
}
export default App;
解釋:
ThemeContext
的上下文,用於存儲主題設定。useContext
Hook 在 ThemedComponent
組件中獲取主題設定的值。ThemeProvider
組件中,我們將主題值設置為 "light",並將其通過上下文提供給所有子組件。App
組件中,我們包裹 ThemedComponent
,使其可以訪問全域的主題設定。這個範例演示了如何使用 useContext
Hook 實現全域主題設定,使所有子組件都能夠訪問和使用相同的主題值。
範例 2:使用 useReducer
管理狀態
import React, { useReducer } from 'react';
// 定義一個 reducer 函數來處理狀態變化
const counterReducer = (state, action) => {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
const Counter = () => {
// 使用 useReducer Hook 初始化狀態和 dispatch 函數
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
// 定義處理按鈕點擊的函數,並分發對應的動作
const handleIncrement = () => {
dispatch({ type: 'INCREMENT' });
};
const handleDecrement = () => {
dispatch({ type: 'DECREMENT' });
};
return (
<div>
<p>計數:{state.count}</p>
<button onClick={handleIncrement}>增加</button>
<button onClick={handleDecrement}>減少</button>
</div>
);
}
export default Counter;
解釋:
counterReducer
的 reducer 函數,它處理狀態的變化,根據動作的類型進行增加或減少操作。Counter
組件中,我們使用 useReducer
Hook 初始化狀態和 dispatch
函數,並將 counterReducer
作為第一個參數傳遞。dispatch
函數,以更新狀態。state.count
)在界面上顯示,並在按鈕上設置點擊事件處理程序,以執行增加和減少操作。這個範例演示了如何使用 useReducer
Hook 來管理複雜的狀態邏輯,並使用 reducer 函數處理不同的動作。